
#define _BSD_SOURCE 
#include"sock.h"
#include<netdb.h>
//在将数据（包括ip，port）存储到socket上时，需要将其转换为网络字节序

#define PORT 33333
void trans()
{
    printf("trans\nhostPost is : %d\n",PORT);
    int netPort = htons(PORT);
    printf("netPort is : %d\n",netPort);
    int hostPort = ntohs(netPort);
    printf("hostPost is : %d\n",hostPort);
}

//主机地址可以表示为一个二进制或一个符号主机名或展现格式（点分十进制（Str） ， 十六进制字符串）
        /*对应的函数是 ： inet_pton , inet_ntop*/

//端口号可以表示为一个二进制或一个符号服务器名
        /*对应的函数是 ： getaddrinfo ,getnameinfo*/

// inet_pton 字符串 -> struct in(6)_addr 二进制 (网络)
// inet_ntop struct in(6)_addr 二进制 (网络) -> 字符串 
// 主要是用来
void ipTo()
{
    #define IP "::81.70.195.20"
    printf("IP string is: %s \n",IP);
    char claddrStr[INET6_ADDRSTRLEN];
    struct sockaddr_in6 claddr;
    memset(&claddr,0,sizeof claddr);
    claddr.sin6_family = AF_INET6;
    claddr.sin6_port = htons(PORT_NUM);
    if (inet_pton(AF_INET6, IP, &claddr.sin6_addr) <= 0)
        fatal("inet_pton failed for address '%s'", IP);

    if (inet_ntop(AF_INET6, &claddr.sin6_addr, claddrStr,
                    INET_ADDRSTRLEN) == NULL)
            printf("Couldn't convert client address to string\n");
    printf("IP string is: %s \n",claddrStr);

}

// getaddrinfo 将主机(IP)和服务名(端口号)   （socket地址结构，result）
// getnameinfo 将socket地址结构  主机(IP)和服务名(端口号)
//998页，主要是用来做socket的地址与专业，比如用于connect

void getIPandPort()
{
    #define IP "81.70.195.20"
    #define hostName "wangzhengjia.cn"
    #define Service "daytime" // 可以查到13
    #define PORT "33333"

    struct addrinfo hints, *result;
    memset(&hints, 0, sizeof hints);
    hints.ai_canonname = NULL;
    hints.ai_addr = NULL;
    hints.ai_next = NULL;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_family = AF_UNSPEC ;// IPv6 and IPv4都可以
    // hints.ai_flags = AI_NUMERICSERV; // service被解释为端口
    
    assert(getaddrinfo(IP,Service,&hints,&result) == 0);

    for(struct addrinfo *rp = result;rp != NULL; rp = rp ->ai_next){
        char ip[NI_MAXHOST], port[NI_MAXSERV];
        getnameinfo(rp->ai_addr, rp->ai_addrlen, ip, NI_MAXHOST, port, NI_MAXSERV, NI_NUMERICSERV );
        printf("(IP, Port) is (%s, %s)\n",ip,port);
    }
}

int main(int argc, char **argv)
{
    trans();
    puts("");
    ipTo();
    puts("");

    getIPandPort();
    return 0;
}